package controllers;

import static akka.pattern.Patterns.ask;
import static java.util.concurrent.TimeUnit.SECONDS;
import play.*;
import play.libs.Akka;
import play.mvc.*;
import scala.concurrent.Await;
import scala.concurrent.duration.Duration;
import akka.actor.ActorRef;
import akka.actor.Props;

import com.fasterxml.jackson.databind.JsonNode; 

import models.*;
import models.msgs.AddPlayer;
import models.msgs.Creator;
import models.msgs.Join;
import views.html.*;

public class Application extends Controller {
    private static int iloscGraczy;
    
    public static Result index() {
        return ok(index.render());
    }
    
    public static Result pokerRoom(String username, String _iloscGraczy, String iloscBotow, String poczatkowe, String wpisowe){
    	if(iloscGraczy == 0){
    		iloscGraczy = Integer.parseInt(_iloscGraczy);
    	}
    	if(Gra.getObecnych() >= iloscGraczy){
			flash("error", "Jest już pełny pokój");
			return redirect(routes.Application.index());
		}
    	
    	if(username == null || username.trim().equals("")){
		    flash("error", "Nie wybrałeś nicku.");
	        return redirect(routes.Application.index());
		}
		
		if(Gra.getStol() != null && (!_iloscGraczy.trim().equals("") || !iloscBotow.trim().equals("")
				|| !poczatkowe.trim().equals("") || !wpisowe.trim().equals(""))){
			flash("error", "Ktoś już stworzył grę. Dołącz do niej (nie podawaj nowych parametrów).");
			return redirect(routes.Application.index());
			
		}
		
		if(Gra.getStol() == null){
			int nIloscGraczy;
			int nIloscBotow;
			int nPoczatkowe;
			int nWpisowe;
		
			
			try{
				nIloscGraczy = Integer.parseInt(_iloscGraczy);
				nIloscBotow = Integer.parseInt(iloscBotow);
				nPoczatkowe = Integer.parseInt(poczatkowe);
				nWpisowe = Integer.parseInt(wpisowe);
			}
			catch(Exception ex){
				flash("error", "Podałeś złe parametry!");
				return redirect(routes.Application.index());
			}
			
			if(nIloscGraczy > 4 || nIloscGraczy < 2){
                System.out.println("Podano niepopawna liczbe graczy.");
                flash("error", "Podano niepoprawną liczbę graczy.");
				return redirect(routes.Application.index());
            }
            if(nIloscBotow > 4 || nIloscBotow > nIloscGraczy || nIloscBotow < 0 || nIloscGraczy - nIloscBotow < 1){
            	flash("error", "Podano niepoprawną liczbę botów.");
				return redirect(routes.Application.index());
            }
            if(nPoczatkowe < 5 || nWpisowe > nPoczatkowe || nWpisowe < 0){
            	flash("error", "Podałeś złe parametry!");
				return redirect(routes.Application.index());
            }
            
            iloscGraczy = nIloscGraczy;
            Gra.create(nIloscGraczy, nIloscBotow, nPoczatkowe, nWpisowe);
			
			//Creator creator = new Creator(nIloscGraczy, nIloscBotow, nPoczatkowe, nWpisowe);
			//stol.tell(creator, stol);
		}
		
    	if(!Gra.tryJoin(username)){
    		flash("error", "Ten nick jest już zajęty.");
	        return redirect(routes.Application.index());
    	}
		
		return ok(pokerRoom.render(username));
    }
    
    public static Result pokerRoomJs(String username) {
        return ok(views.js.pokerRoom.render(username));
    }
    
    public static WebSocket<JsonNode> poker(final String username) {
        return new WebSocket<JsonNode>() {
            
            // Called when the Websocket Handshake is done.
            public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out){
            	
                //Table.notifyAll(new Info("I've got a WebSocket", username));
                // Join the chat room.
                try {                	
                	Gra.join(username, in, out);
                	if(Gra.getObecnych() == iloscGraczy){
                		Gra.start();
                	}
                	
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
    }

}
